package com.gzsxy.JUC.lock8;

import java.util.concurrent.TimeUnit;

/**
 * 8锁，就是关于锁的8个问题
 * 1.标准情况下，两个线程先打印发短信还是打电话？1. /发短信 2.打电话
 * 2. 在发短信中睡眠4s   还是发短信先执行
 * 原因：synchronized锁的对象是方法的调用者！  因为phone是锁的对象，在最开始就被sendSms方法调用，
 * 所以就只有一个线程持有锁，所以不管怎么样都是发短信先，
 */
public class Test1 {

    public static void main(String[] args) {
        Phone phone = new Phone();


        new Thread(() -> {
            phone.sendSms();
        }, "A").start();

        //捕获
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(() -> {
            phone.call();
        }, "B").start();


    }
}


class Phone {

    //synchronized锁的对象是方法的调用者！
    //两个方法用的是同一个锁，谁先拿到谁执行
    //发短信
    public synchronized void sendSms() {
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("发短信");
    }

    public synchronized void call() {
        System.out.println("打电话");
    }
}